package com.example.day23_h264parse2;

/**
 * Description:使用哥伦布编码
 * Created by Gdu on 2020/12/18 14:11.
 */

public class Main {

    public static void main(String[] args) {
        useColumbusCode();
    }

    //region 使用哥伦布编码
    public static void useColumbusCode(){
        System.out.println("哥伦布编码使用");
        //现有数字4 二进制位100 使用哥伦布编码后数字为00101   在int上为0000 0101
        //nStartBit就是第3位开始才是哥伦布编码
        int nStartBit = 3;
        byte data = 5 & 0xff;//把5转化为二进制
        //统计1前面0的个数
        int nZeroNum = 0;
        while (nStartBit < 8) {
            //0x80是二进制1000 0000  (0x80 >> nStartBit)是把索引移到哥伦布编码开始的头
            //(data & (0x80 >> nStartBit)) 是索引移动到哥伦布编码中的1，所以结果不为0
            if ((data & (0x80 >> nStartBit)) != 0) {
                break;
            }
            nZeroNum++;
            nStartBit++;
        }
        System.out.println("nZeroNum : " + nZeroNum);
        nStartBit++;//这一步是把索引指到哥伦布编码中的1
        int dwRet=0;
        //这个循环是取出1后面的数字
        for (int i = 0; i < nZeroNum; i++) {
            //dwRet左移1位
            dwRet<<=1;
            if ((data & (0x80 >> (nStartBit % 8))) != 0) {//遇到1
                dwRet += 1;//当前位数变为1
            }
            nStartBit++;
        }
        int value = (1<<nZeroNum)+dwRet-1;
        System.out.println("编码原来的数字是"+value);
    }
    //endregion



}
